package com.ms.controller.user;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ms.constant.MessageConstant;
import com.ms.context.BaseContext;
import com.ms.domain.dto.MusicUpdateDTO;
import com.ms.domain.dto.MusicUploadDTO;
import com.ms.domain.entity.Music;
import com.ms.result.Result;
import com.ms.service.MusicService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.List;

@RestController
@RequestMapping("/api/music")
@RequiredArgsConstructor
@Slf4j
@Tag(name = "C端音乐相关接口")
public class MusicController {
    private final MusicService musicService;

    /**
     * 上传音乐
     * @param title 音乐标题
     * @param creatorIds 创建者ids
     * @param description 音乐描述
     * @param genreId 曲风id
     * @param albumId 专辑id
     * @param audioFile 音频文件
     * @param coverImage 封面图片
     * @return 音乐信息
     */
    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    @Operation(summary = "上传音乐")
    public Result<Music> uploadMusic(
            @RequestParam String title,
            @RequestParam String creatorIds,
            @RequestParam(required = false) String description,
            @RequestParam Integer genreId,
            @RequestParam(required = false) Integer albumId,
            @RequestPart MultipartFile audioFile,
            @RequestPart(required = false) MultipartFile coverImage) {

        // 手动验证参数
        if (title == null || title.trim().isEmpty()) {
            return Result.badRequest(MessageConstant.MUSIC_TITLE_EMPTY);
        }
        
        if (title.length() > 100) {
            return Result.badRequest(MessageConstant.MUSIC_TITLE_TOO_LONG);
        }
        
        if (description != null && description.length() > 500) {
            return Result.badRequest(MessageConstant.MUSIC_DESCRIPTION_TOO_LONG);
        }
        
        if (genreId == null) {
            return Result.badRequest(MessageConstant.MUSIC_GENRE_EMPTY);
        }

        // 构建 DTO
        MusicUploadDTO dto = new MusicUploadDTO();
        dto.setTitle(title);
        dto.setCreatorIds(creatorIds);
        dto.setDescription(description);
        dto.setGenreId(genreId);
        dto.setAlbumId(albumId);

        Music music = musicService.uploadMusic(dto, audioFile, coverImage);
        return Result.success(music);
    }

    /**
     * 通过 id 获取音乐
     * @param id 音乐id
     * @return 音乐信息
     */
    @GetMapping("/{id}")
    @Operation(summary = "通过id获取音乐")
    public Result<Music> getMusicById(@PathVariable Integer id) {
        return Result.success(musicService.getMusicById(id));
    }

    /**
     * 分页获取音乐列表
     * @param page 页码
     * @param size 页大小
     * @return 音乐列表
     */
    @GetMapping
    @Operation(summary = "分页获取音乐列表")
    public Result<Page<Music>> getMusicPage(
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size) {
        return Result.success(musicService.getMusicPage(page, size));
    }

    /**
     * 通过 曲风id 获取音乐列表
     * @param genreId 曲风id
     * @return 音乐列表
     */
    @GetMapping("/by-genre/{genreId}")
    @Operation(summary = "通过 曲风id 获取音乐列表")
    public Result<List<Music>> getMusicByGenre(@PathVariable Integer genreId) {
        return Result.success(musicService.getMusicByGenre(genreId));
    }

    /**
     * 通过 曲风id 分页获取音乐列表
     * @param genreId 曲风id
     * @param page 页码
     * @param size 每页数量
     * @return 音乐分页数据
     */
    @GetMapping("/by-genre/{genreId}/page")
    @Operation(summary = "通过 曲风id 分页获取音乐列表")
    public Result<Page<Music>> getMusicPageByGenre(
            @PathVariable Integer genreId,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size) {
        return Result.success(musicService.getMusicPageByGenre(genreId, page, size));
    }

    /**
     * 通过 用户id 获取用户音乐列表
     * @param userId 用户id
     * @return 音乐列表
     */
    @GetMapping("/user/{userId}")
    @Operation(summary = "通过 用户id 获取用户音乐列表")
    public Result<List<Music>> getUserMusic(@PathVariable Integer userId) {
//        // 权限检查：只能查看自己的音乐
//        if (!userId.equals(BaseContext.getCurrentId())) {
//            return Result.forbidden(MessageConstant.PERMISSION_DENIED);
//        }
        return Result.success(musicService.getUserMusic(userId));
    }

    /**
     * 分页获取用户音乐列表
     * @param userId 用户id
     * @param page 页码
     * @param size 每页数量
     * @return 音乐分页数据
     */
    @GetMapping("/user/{userId}/page")
    @Operation(summary = "分页获取用户音乐列表")
    public Result<Page<Music>> getUserMusicPage(
            @PathVariable Integer userId,
            @RequestParam(defaultValue = "1") Integer page,
            @RequestParam(defaultValue = "10") Integer size) {
        // 权限检查：只能查看自己的音乐
        if (!userId.equals(BaseContext.getCurrentId())) {
            return Result.forbidden(MessageConstant.PERMISSION_DENIED);
        }
        return Result.success(musicService.getUserMusicPage(userId, page, size));
    }

    /**
     * 更新音乐
     * @param dto 音乐信息
     * @return 无
     */
    @PutMapping
    @Operation(summary = "更新音乐")
    public Result<Void> updateMusic(@RequestBody @Valid MusicUpdateDTO dto) {
        musicService.updateMusic(dto);
        return Result.success();
    }

    /**
     * 根据 id 删除音乐
     * @param id 音乐id
     * @return 无
     */
    @DeleteMapping("/{id}")
    @Operation(summary = "根据 id 删除音乐")
    public Result<Void> deleteMusic(@PathVariable Integer id) {
        musicService.deleteMusic(id);
        return Result.success();
    }

//    @PostMapping("/{id}/play")
//    public Result<Void> recordPlay(@PathVariable Integer id) {
//        // 记录播放次数（简化实现）
//        musicService.recordPlay(id);
//        return Result.success();
//    }
}